
const { baseUrl } = require('./env.js').dev;

const appid = '';
// const appid = ' ';
let isRefreshing = true;
let subscribers = [];

function onAccessTokenFetched() {
  subscribers.forEach((callback) => {
    callback();
  })
  subscribers = [];
}

function addSubscriber(callback) {
  subscribers.push(callback);
  console.log('重新请求的队列', callback, subscribers)
}

let userInfo = '';

wx.getStorage({
  key: 'userInfo',
  success(res) {
    // console.log(res.data.userInfo);
    userInfo = res.data.userInfo;
  }
});

export class Http {
  constructor() { }

  request({
    url,
    data = {},
    method,
    header,
    callback = '',
    type,
  } = {}) {
    let _this = this;
    let _url = `${baseUrl}/${url}`;
    return new Promise((resolve, reject) => {
      // wx.showLoading({
      //     title: '正在加载',
      // });
      wx.request({
        url: _url,
        data,
        method,
        header: {
          'content-type': type,
          'Authorization': wx.getStorageSync('Authorization')
        },
        callback,
        fail(res) {
          // setTimeout(function () {
          //     wx.hideLoading()
          // }, 200)
          // reject(res)
          reject('发送失败');
          wx.showToast({
            title: '网络错误',
            icon: 'none',
            duration: 2000
          })
          // wx.showModal({
          //     title: '提示',
          //     content: '网络错误',
          //     success(res) {
          //         if (res.confirm) {
          //             console.log('用户点击确定');
          //         } else if (res.cancel) {
          //             console.log('用户点击取消');
          //         }
          //     }
          // })
        },
        complete: res => {

          setTimeout(function () {
            wx.hideLoading()
          }, 300)
          //console.log('这里是请求canshu-----------------', url, data, method, header, res, wx.getStorageSync('QS_TOKEN'));
          if (callback) return callback(res.data);
          if (res.statusCode == 200) {
            if (res.data.code == 200) {
              resolve(res.data);
            }
            //统一拦截
            if (res.data.code == 401) {
              console.log('触发了一次401', url,)
              wx.setStorageSync('isLogin', false)
              // wx.showToast({
              //     title: '登录已过期',
              // })
              // 将需要重新执行的接口缓存到一个队列中
              if (userInfo) {
                addSubscriber(() => {
                  _this.request({
                    url,
                    data,
                    method,
                    header,
                    callback: resolve,
                    type,
                  })
                })
              }
              // console.log('这里是isRefreshing的值----', isRefreshing)
              if (isRefreshing) {
                getNewToken().then(() => {
                  // 依次去执行缓存的接口
                  onAccessTokenFetched();
                  isRefreshing = true;
                })
              }
              isRefreshing = false;
              //    console.log('这里是isRefreshing的值', isRefreshing)
            }

            if (res.data.code == 500) {
              // wx.hideLoading();
              wx.showToast({
                title: res.data.msg,
                icon: 'none',
                duration: 2000
              })
            }
            if (res.data.code == 404) {
              // wx.hideLoading();
              wx.showToast({
                title: '参数效验失败',
                icon: 'none'
              })
            }
            if (res.data.code == 403) {
              // wx.hideLoading();
              wx.showToast({
                title: '没有相关权限',
                icon: 'none'
              })
            }
            if (res.data.code == 402) {
              wx.hideLoading();
            }
          } else {
            // wx.hideLoading();
            wx.showToast({
              title: '请求有误',
              icon: 'none'
            })
          }
        }
      })
    })
  }
}

// 获取token
const getNewToken = () => {
  return new Promise((resolve, reject) => {
    wx.login({
      success(res) {
        console.log('执行了重新登录的方法', res, userInfo);
        let userInfo = '';
        wx.getStorage({
          key: 'userInfo',
          success(resData) {
            userInfo = resData.data;
            if (userInfo) {
              wx.request({
                url: `${baseUrl}/wx/user/${appid}/login3`,
                data: {
                  "code": res.code,
                  "signature": userInfo.signature,
                  "rawData": userInfo.rawData,
                  "encryptedData": userInfo.encryptedData,
                  "iv": userInfo.iv
                },
                method: 'POST',
                header: {
                  'content-type': 'application/json',
                },
                success(res) {
                  console.log('重新登陆成功返回', res);
                  let r = res.data;
                  // 将所有存储到观察者数组中的请求重新执行。

                  if (res.data.code == 200) {
                    //                         // 登录成功
                    // const token = r['data']['token'];
                    wx.hideLoading();
                    wx.setStorageSync("Authorization", res.data.data);
                    wx.setStorageSync('isLogin', true);
                    resolve(res); //通过Promise的 resolve(),把返回的结果暴露出去  这个暴露好像用处不太大， 可以不用
                  } else {
                    wx.removeStorageSync('Authorization');
                  }
                }
              })
            } else {
              wx.showToast({
                title: '请先登录',
                icon: 'none'
              })
              console.log('这里是拦截器---还没有登录哦',);
            }
          }
        });

      },
      fail(err) {
        reject()
        console.error('wx login fail', err);
      }
    });
  })
}
